package com.atguigu.order;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * 启动类，用于引导Spring应用，并配置服务发现
 */
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class OrderMainApplication {
    /**
     * 主函数，用于启动Spring Boot应用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        SpringApplication.run(OrderMainApplication.class, args);
    }

    /**
     * 创建一个ApplicationRunner bean，用于在项目启动后执行特定的逻辑
     * 此处的逻辑是监听配置文件的变化，并在变化时处理配置信息
     * @param nacosConfigManager Nacos配置管理器，用于获取配置服务
     * @return ApplicationRunner 实例，用于执行启动后的逻辑
     */
    //1.项目启动就监听配置文件变化
    //2.发生变化后拿到变化值
    //3.发送邮件
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){
        return args -> {
            ConfigService configService = nacosConfigManager.getConfigService();
            // 添加配置文件监听器，指定配置文件名和组
            configService.addListener("service-order.properties", "DEFAULT_GROUP",
                    new Listener() {
                        /**
                         * 返回一个线程池，用于异步处理配置信息变化
                         * @return Executor 线程池实例
                         */
                        @Override
                        public Executor getExecutor() {
                           return Executors.newFixedThreadPool(4);
                        }

                        /**
                         * 当配置信息变化时，此方法被调用，用于处理变化的配置信息
                         * @param s 变化的配置信息
                         */
                        @Override
                        public void receiveConfigInfo(String s) {
                            System.out.println("变化的配置信息:"+s);
                            System.out.println("邮件通知......");
                        }
                    });
            // 标识配置监听器已添加完成
            System.out.println("======================");
        };
    }
}
